package com.example.demo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * 执行顺序：
 * 1、Filter的初始化
 * 2、Filter的开始
 * 3、Intercept的preHandle
 * 4、beforeBodyRead的读取DTO传参体
 * 5、DTO的注解校验传参
 * 6、AOP的@Around中的开始
 * 7、AOP的@Before
 * 8、@RequestParam的注解校验传参
 * 9、point.proceed()的接口逻辑
 * 10、AOP的@AfterReturning / @AfterThrowing
 * 11、AOP的@After（正常或异常都会执行，类似finally）
 * 12、AOP的@Around中的结束
 * 13、JsonSerializer的serialize（VO类属性的注解处理）
 * 14、beforeBodyWrite的重新封装返回值格式
 * 15、Intercept的postHandle
 * 16、Intercept的afterCompletion
 * 17、ServletRequestHandledEvent事件（接口请求处理完成后的触发事件）
 * 18、Filter的结束
 *
 * 注：
 * 1、若将接口访问限制逻辑写在AOP里，Intercept里就不应再写任何校验逻辑
 * 2、若启动Intercept，则将接口访问限制与token校验按顺序写入
 */
@SpringBootApplication
@EnableTransactionManagement
@MapperScan("com.example.demo.mapper")
@ServletComponentScan(basePackages = {"com.example.demo.filter"})
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}
